package main

import (
	"fmt"
	"time"
)

func main() {
	testNoBufferChannel()
	//testNoBufferDeadLock()
	//testBufferChannel()

}

/*
往无缓冲通道发送数据时必须要有接收者，否则会阻塞
*/
func testNoBufferChannel() {
	ch := make(chan int)
	go recv(ch) // 启用goroutine从通道接收值
	ch <- 10
	fmt.Println("发送成功")
}

func recv(c chan int) {
	time.Sleep(5 * time.Second)
	ret := <-c
	fmt.Println("接收成功", ret)
}

/*
往无缓冲的通道发送数据，会导致当前线程阻塞，那么系统就永远无法调用接收方法了，从而导致死锁
*/
func testNoBufferDeadLock() {
	ch := make(chan int)
	ch <- 15
	ret := <-ch
	fmt.Println(ret)
}

/*
往有缓冲通道发送数据时，
	如果数据量没有超过容量，不会阻塞
	如果数据量超过容量，就需要有接收者，否则会阻塞
*/
func testBufferChannel() {
	ch := make(chan int, 1)
	ch <- 5
	res1 := <-ch
	fmt.Println(res1)
}
